class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 1: Geoinformática utilizando el entorno de R ### TipologÃa de datos comunes en GeografÃa y buenas prácticas de programación MatÃas Olea <br> <a href="https://orcid.org/0000-0003-0194-7784"> ORCID </a><br> matias.olea@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Agosto 2025</b>] <br> --- ## Contenidos .pull-left[ 1) ¿Qué es R? 2) Elementos esenciales de R: Script, objetos, funciones y paquetes. 3) Apertura y manipulación de datos alfanuméricos y numéricos. 4) TipologÃa de datos geográficos 5) Buenas prácticas para escribir un script. ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ### ¿Qué es R? -- - R es un software de **libre acceso** (gratuito y abierto) para el análisis estadÃstico. -- - Es un pseudo-lenguaje de programación orientado a **''objetos''** -- - Hoy en dÃa, R no es solo una herramienta de análisis estadÃstico. Gracias a su potencialidad se ha transformado en una herramienta para analizar imágenes satelitales, datos del océano, variables biogeográficas, muestras dendro-cronológicas, cambio climático, etc… incluso se pueden hacer mapas. --- ### ¿Qué significa orientado a **objetos**? -- .pull-left[ Significa que si nosotros queremos aplicar una operación (función) podemos aplicárselo a un **"algo"** dentro del entorno de R, y ese "algo" va a ser un **"contenedor"** dónde almacenaremos variables o datos, como por ejemplo números, palabras, vectores, tablas, etc., en nuestro entorno de R. De esta forma, dependiendo que elemento contegamos es nuestro objeto, se definirá la **clase** o tipo del objeto. ] -- .pull-right[ <img src="data:image/png;base64,#Objeto_de_R.png" width="400px" align = "center"/> ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: -- .left-column[ <center><img src="data:image/png;base64,#Objeto_vector.png" height="400px" /></center> ] .right-column[ - **Vector**: secuencia de valores, o valores únicos de tipo numéricos (enteros, dobles/decimales), lógicos, complejos y de caracteres. - **Factor**: Es una variable de tipo categórica que indican ordinalidad, nombres o clases. ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#DF_MX2.png" height="400px" /></center> ] .right-column[ - **Matrices**: estructura bidimensional formada filas y columnas. Pueden ser pensadas similar a que son vetores donde cada vector es una unica fila o columna. Se requiere que todos los elementos dentro de la matriz sean de un mismo tipo: numerico, caracter o factor. - **Data Frame**: tambien es una estructura bidemensional formada por lineas/filas (observaciones) y columnas (variables). Dentro de su estructura, las columnas pueden ser vectores numéricos, de caracteres o factores. Puede almacenar distintos tipos por columnas. Una caracterÃstica distintiva es que almacena "headers" que nombran la variable, pero este forma, y no forma, parte de los datos en si mismo. Las matrices no almacen headers pero si podemos indicarle nombre a cada columna y fila. ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#Objeto_lista.png" height="400px" /></center> ] .right-column[ - **Lista**: Es una compilación de datos enlistados ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#Objeto_lista2.png" height="400px" /></center> ] .right-column[ - **Lista**: Es una compilación de datos enlistados, pueden ser de varias clases. ] --- ### Elementos de R Ya conociendo que son los objetos de R, debemos considerar los siguientes elementos: -- **Funciones**: Son operaciones o aplicaciones que se le aplican a un conjunto de elementos o a un objeto de R. Los podemos reconocer debido a que se escriben seguido de un parentesis: ``` r nombre_funcion(...) ``` -- **Argumentos**: Cada función contiene un cierto número de argumentos o parámetros que permiten que la función sea aplicada. Un argumento puede ser el objeto al que se le aplicará, o alguna indicación extra, como por ejemplo el no considerar valores vacÃos o sin dato: ``` r nombre_funcion(argumento1, argumento2, ...) ``` Cuando una función cuanta con más de un argumento, estos se indican de forma separada por coma (<b>,</b>) --- ### Elementos de R **Paquetes**: Un paquete en R es una colección de funciones y/o datos, la cual el autor ha dedicido que esté disponible para su uso, y luego de pasar por algunos test especÃficos, puede incorporarse al CRAN de R. Una vez el paquete esté disponible en el CRAN facilmente se puede instalar en nuestro R (en nuestros computadores) con la siguiente función: ``` r install.packages("Nombre_del_paquete") # debe indicarse entre comillas. ``` una vez instalado el paquete, y si deseamos incorporarlo y utilizarlo en nuestro código, lo llamamos (activamos) con la siguiente función: ``` r librar(Nombre_del_paquete) # debe indicarse sin comillas ``` --- #### Argumentos de una función -- ``` r ??seq() ``` -- ``` r ## from = inicio ## to = final ## by = intervalo ``` -- ``` r seq(from = 2, to = 50, by = 3) ``` ``` ## [1] 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 ``` --- ### Operadores lógicos Ocupamos operadores lógicos cuando queremos expresar si una afirmación es verdadera (**TRUE** ó **T**) o falsa (**FALSE** ó **F**). -- - Para decir una negación, o que algo es diferente a ..., usamos el signo de cierre exclamación antes **!** -- <b>Ej. 1:</b> ¿El vector constelaciones es clase númerico? -- ``` r constelaciones <- c("Pegaso", "Orion", "Centauro") is.numeric(constelaciones) ``` ``` ## [1] FALSE ``` -- <b>Ej. 2:</b> ¿El vector constelaciones es diferente a clase númerico? -- ``` r !is.numeric(constelaciones) ``` ``` ## [1] TRUE ``` --- ### Operadores lógicos Ocupamos operadores lógicos cuando queremos expresar si una afirmación es verdadera (**TRUE** ó **T**) o falsa (**FALSE** ó **F**). - Para referirnos a una condicion "x" **ó** "y", usamos **|** -- <b>Ej. 3:</b> ¿Es el vector secuencia ó el vector constelaciones de clase númerico? (¿es alguno numérico?) -- ``` r secuencia <- seq(from = 2, to = 50, by = 3) is.numeric(secuencia) | is.numeric(constelaciones) ``` ``` ## [1] TRUE ``` -- - Para referirnos a una condición "x" **y** "y", usamos **&** -- <b>Ej. 4:</b> ¿Son el vector secuencia y el vector constelaciones de clase númerico? (¿son ambos numéricos?) -- ``` r is.numeric(secuencia) & is.numeric(constelaciones) ``` ``` ## [1] FALSE ``` --- ### Operadores de relaciones Ocupamos operadores de relaciones cuando queremos establecer desigualdades dentro de nuestro conjunto de datos: -- - Menor o mayor que **<**, **>**. -- - Menor o igual, mayor o igual que **=<**, **>=**. -- - Igual a **==** -- - Diferente a **!=** --- ### Operadores de relaciones #### Algunos ejemplos ``` r set.seed(100) # Esto garantiza que dentro de la aleatoriedad, # todos tengamos el mismo resultado simulado. aleatorios <- rnorm(n = 10, mean = 50, sd = 10) print(aleatorios) ``` ``` ## [1] 44.97808 51.31531 49.21083 58.86785 51.16971 53.18630 44.18209 57.14533 ## [9] 41.74741 46.40138 ``` -- ``` r aleatorios > 50 ``` ``` ## [1] FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE FALSE ``` --- ### Operadores de relaciones #### Algunos ejemplos ``` r which(aleatorios > 50) ``` ``` ## [1] 2 4 5 6 8 ``` -- ``` r which(aleatorios < 45) ``` ``` ## [1] 1 7 9 ``` --- ### Creando una pequeña base de datos estilo tabla ``` r set.seed(100) # Esto garantiza que dentro de la aleatoriedad, # todos tengamos el mismo resultado simulado. vpm1 <- rnorm(n = 100, mean = 80, sd = 5) vpm2 <- rnorm(n = 100, mean = 75, sd = 10) vpm3 <- rnorm(n = 100, mean = 60, sd = 25) tabla <- data.frame(vpm1, vpm2, vpm3) ``` --- ### Creando una pequeña tabla ``` r view(tabla) ```
--- ### Creando una pequeña tabla Ahora si nos fijamos, nuestros valores aleatorios se generan con "n" cantidad de decimales, más de los que necesitamos, por lo que tenemos algunas opciones para limitarlos con la funciones: -- ``` r # debemos indicar el valor o vector, y el número de decimales. Aproxima el último valor. round(x = 77.5492, digits = 2) ``` ``` ## [1] 77.55 ``` ``` r # debemos indicar el valor o vector, y el número de dÃgitos. Aproxima el último valor. signif(77.5492, 4) ``` ``` ## [1] 77.55 ``` --- ### Creando una pequeña tabla Ahora si nos fijamos, nuestros valores aleatorios se generan con "n" cantidad de decimales, más de los que necesitamos, por lo que tenemos algunas opciones para limitarlos con la funciones: -- ``` r # redondea al entero próximo sin aproximar. floor(77.5492) ``` ``` ## [1] 77 ``` ``` r # nos permite cortar decimales sin apróximar, dincando el valor o vector, # multiplicarlo por una potencia de 10 (dependiendo de cuantos decimales queremos) # y dividirlo por la misma potencia. trunc(77.5492 * 100) / 100 ``` ``` ## [1] 77.54 ``` --- ### Creando una pequeña tabla Sabiendo ello, tenemos 2 alternativas: a) Alojando una función dentro de otra. ``` r set.seed(100) round(rnorm(n = 10, mean = 80, sd = 5), digits = 2) ``` ``` ## [1] 77.49 80.66 79.61 84.43 80.58 81.59 77.09 83.57 75.87 78.20 ``` b) Encadenando procesos y la librerÃa **magrittr** que veremos en detalles en la siguiente unidad. --- ### Creando una pequeña tabla ``` r tabla_round <- round(tabla, 2) view(tabla) ``` ``` r tabla_round <- round(tabla, 2) ```
--- ### Manipulando una tablas Las primeras manipulaciones consisten en: - Sustraer - Filtrar - Modificar o - Agregar Información nueva a nuestra base datos. --- ### Abrir una tabla ``` r # Para abrir un archivo en formato csv: # el argumento dec determina el tipo de separador de decimales, y # el argumento sep el separador de columnas tabla_csv <- read.csv("TuDirectorioPersonal/MET_CAUQUENES.csv", dec=".") # Para abrir un archivo en formato xls # install.packages("xlsx") library(readxl) tabla_excel <- read_excel("TuDirectorioPersonal/MET_CAUQUENES.xls",sheet=1) ``` --- ### Manipulando una tablas -- **Sustraer** ``` r # Opción 1: por nombre de la columna sub_1 <- tabla_csv$PP # Opción 2: por posición de la columna sub_2 <- tabla_csv[,5] # Opción 3: por posición de la fila sub_3 <- tabla_csv[58,] ``` --- ### Manipulando una tablas **Filtrar** ``` r # Opcion 1: por condición según columna filtro_1 <- tabla_csv[which(tabla_csv$Month == 3),] # Opción 2: usando función subset() filtro_2 <- subset(tabla_csv, Month == 8) # Opcion 3: usando la función filter() del paquete dplyr #install.package("dplyr") library(dplyr) filtro_3 <- filter(tabla_csv, Year == 2019) ``` --- **Modificar** ``` r # Opción 1: modificar una columna completa mod <- tabla_csv # con esto nos aseguramos de no cometer errores en la original mod$PP <- mod$PP / 1000 # para pasar de mm a cm3 # Opción 2: cambiar algunos elementos según condición mod[which(mod$Year < 1990), ] <- NA # NA es Not Available o sea sin dato mod <- na.omit(mod) # eliminamos las filas con NA's # se podrÃa haber llegado a este mismo resultado solo filtrando # ... y tantas otras opciones que se nos ocurran ``` **Agregar** ``` r mod$Amp <- mod$Tmax - mod$Tmin # creamos una nueva columna amp con la diferencia entre Tmin y Tmax ```
--- ### Manipulando una tablas Combinemos estas acciones. Se requiere obtener el promedio anual de la temperatura mÃnima, media y máxima para el año 2010. -- ``` r # Filtramos nuestros datos al año 2010 filtro_2010 <- filter(tabla_csv, Year == 2010) ``` -- ``` r # Seleccionamos las columnas que necesitamos filtro_2010_temperatura <- filtro_2010[, c(5:7)] ``` -- ``` r # Usamos la función apply para aplicar una función a todas las columnas o filas temperatura_media_2010 <- apply(X = filtro_2010_temperatura, MARGIN = 2, FUN = mean) ``` ``` ## Tmin Tmed Tmax ## 6.713333 13.402500 20.092500 ``` --- ### Manipulando una tablas **TAREA 1**: Responda las siguientes preguntas ¿Cuál es la temperatura mÃnima promedio para el mes de Abril? ¿Cuál es la máxima histórica y la amplitud máxima para el mes de Enero? ¿Cuándo ocurrió la máxima histórica? --- ### TipologÃa de datos geográficos Ya revisamos la base de la información geográfica que son las tablas de información, que corresponden a la tabla de atributos en un vector geográfico cuando la información tiene una expresión espacial explicita (puntos, lineas y polÃgonos). No hay que confundir los **vectores geográficos** (que comunmente solo se les llama vectores), con los **vectores matemáticos**, que son los que revisamos en las clases de objetos. La información espacial puede expresarse a través de los modelos vectoriales (geográficos; puntos lineas y polÃgonos) y los modelos ráster (matrices). Pero cada una de ellas puede ser almacenada en distintos tipos de archivos. --- ### TipologÃa de datos geográficos #### Vectores - Shapefile: *.shp ?? - GeoJSON: *.geojson ?? - Keyhole Markup Language: *.kml/kmz ?? - GeoPackage: *.gpkg ?? - Geodatabase: *.gdb ?? **TAREA 2**: Averiguar la diferencia entre cada uno de esos tipos de vectores --- ### TipologÃa de datos geográficos #### Ráster Los modelos ráster pueden ser almacenados en múltiples formatos, los más comunes son: -- - **GeoTIFF** (Geographical Tagged Image File Format). Fuente de datos en formato Tiff, con la particularidad de que es <u>capaz de almacenar información de referencia espacial</u>. -- - **GMLJP2** (Geographic Markup Language JPEG2000). Muy parecido al formato JPEG pero con <u>mayores beneficios a la hora de comprensión de los datos</u> sin perder información o calidad. -- - **NetCDF** (Network Common Data Form). Fuente de datos creada para el almacenamiento de información cientÃfica en varias dimensiones. Esta fuente de información se asocia principalmente a datos de tipos climáticos o productos satelitales. Su <u>gran capacidad de información</u> la hacen muy útil para compartir grandes volúmenes de información. -- - **HDF** (Hierarchical Data Format). Al igual que el NetCDF, son fuentes creadas para almacenar <u>grandes volúmenes de información</u> cientÃfica espacial. -- - **HGT** Formato asociado a modelo de elevación SRTM (Shuttle Radar Topography Mission Height) <u>caracterizado por almacenar valores enteros positivos y negativos de 2 bits</u>. --- ## Estructura de almacenamiento Por ejemplo si tenemos la información grillada resumen de una decada, o de una fecha en especÃfica, el archivo tendrá solo 1 capa de información (banda o layer), estos archivos se conocen como archivos **monobanda** en terminos de Geoinformática. Por otra, si en un mismo archivo, contamos con 2 o más capas de información, por ejemplo 1 capa por mes (es decir 12 capas en 1 año), denominamos este archivo **multibanda**. <center> <img src="data:image/png;base64,#mono_multi.png" width="450px"/> </center> .footnote[ <span style="font-size:9pt"> * Tener ojo los archivos multibanda no significa siempre que un layer o banda adicional sea siempre tiempo, puede ser cualquier tipo de información. Ej: en el layer 1 podemos tener la elevación del relieve, en el layer 2 la precipitación del año 2023, en el layer 3 la cobertura de uso de suelo, etc. </span> ] --- ### Buenas Practias para escribir un script - En R no existe una guÃa universal de sintaxis para el desarrollo de un script. Sin embargo, es recomendable trabajar de forma homogénea, uniforme y legible. - Disponemos de librerÃas como **styler** que nos ayudan a mejorar el estilo de nuestros scripts. -- - Nuestras recomendaciones generales son las siguientes: - Evite las lÃneas de código muy largas (> 80 caracteres). - Use espacios después de las comas. - Los operadores (==, +, <-, %>%, etc.) deben tener un espacio antes y después. - No poner espacios entre el nombre de una función y el primer paréntesis, ni tampoco entre el último argumento de la función. - Evite usar nombres de funciones o variables que ya existen (c <- 10, c()). - Evite el uso de caracteres especiales en nombres de objetos, archivos o rutas. - Use una sola estructura para los nombres de los objetos (ej: usar solo "." o solo "_") --- ### BibliografÃa 2011 Teetor Paul. _R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics_. Versión en Linea por Chang Winston. <a href="http://www.cookbook-r.com/"> (Online) </a><br> 2015 McNeill Mhairi. _Base R (RStudio Cheatsheet)_. Disponible en Aula virtual. 2018 Mas, Jean-Francois. _Análisis espacial con R. Usa R como un Sistema de Información Geográfica_. European Scientific Institute, Republic of Macedonia. 2020 R. _The R Project for Statistical Computing_. <a href="https://www.r-project.org/"> (Online) </a><br> 2023 Randahl, David. _The R Researcher’s companion_. <a href="https://bookdown.org/david_randahl/r_book/"> (Online) </a><br>